#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：prod_ctrl_service 
@File    ：report_prod_param.py
@IDE     ：PyCharm 
@Author  ：孔令伟
@Date    ：8/23/24 11:11 AM 
"""
from typing import Dict, List, Union

from mg_app_framework import MesCode, get_organization

from common.basic_mongo import get_mongo_collection
from prod_ctrl_service.tool.tool import check_basic_param, get_time

"""
######## IF043
生产过程-产品过程参数上报-按电芯码上传产品过程参数
上位系统按需向MES反馈产品加工参数, 产品过程参数写入数据库
"""


async def report_prod_param_check(
    params: Dict[str, Union[str, List[Dict[str, str]]]]
) -> Dict[str, Union[str, Dict]]:
    """
    上位系统按需向MES反馈产品加工参数, 产品过程参数写入数据库
    :param params:{
               "call_id":"JQ00386",  #接口调用方认证ID, string
               "trace_id":"8941d16b-0581-4e68-8940-a651afff4282",  #接口调用ID, string
               "upperpc_code": "UP011",    #上位机编码, string
               "user_code":"Y001",  #员工编码, string
               "equip_code":"ZP001",   #设备编码, string
               "process_code":"2050",   # 工序编码, string, 必输
               "wip_no":"WW202408140001",   #在制品唯一码, string, 非必输, 在制品批次码、在制单件码或载具码
               "param_list": [   #参数列表
                  {
                     "param_code": "PM101",  #参数编码
                     "param_value": "100"    #参数采集值
                  },
                  {
                     "param_code": "PM102",
                     "param_value": "1.45"
                  }]
              }
    :return:{
           "code": "success",   #接口应答状态代码, success：成功; fail：失败, string
           "data": {},  # 接口返回结果描述, json数组, 本接口不需要返回数据，返回null
           "info": "OK"   #接口返回信息描述, 如果为fail, 则为fail的异常描述信息, string
        }
    """
    error_msg = ""
    # '接口调用方认证ID/接口调用ID/上位机编码/员工编码/设备编码'是每一个接口都有且必填的入参，检查这些参数是否填写
    basic_param_check_result, basic_param_check_message = check_basic_param(params=params)
    if not basic_param_check_result:
        error_msg += basic_param_check_message

    param_list = params.get("param_list", None)
    if not param_list:
        error_msg += "请检查是否已填写'参数列表(param_list)'"
    if error_msg:
        result = {
            "code": MesCode.fail,  # 接口应答状态代码, success：成功; fail：失败, string
            "data": {},  # 接口返回结果描述, json数组, 本接口不需要返回数据，返回null
            "info": error_msg,  # 接口返回信息描述, 如果为fail, 则为fail的异常描述信息, string
        }
        return result

    # todo 产品过程参数写入数据库
    data = {
        "call_id": params.get("call_id"),  # 接口调用方认证ID, string
        "trace_id": params.get("trace_id"),  # 接口调用ID, string
        "upperpc_code": params.get("upperpc_code"),  # 上位机编码, string
        "user_code": params.get("user_code"),  # 员工编码, string
        "equip_code": params.get("equip_code"),  # 设备编码, string
        "process_code": params.get("process_code"),  # 工序编码, string
        "wip_no": params.get("wip_no"),  # 在制品唯一码, string, 非必输, 在制品批次码、在制单件码或载具码
        "param_list": params.get("param_list"),
        "time": get_time(),
    }
    await insert_data(data)

    result = {
        "code": MesCode.success,  # 接口应答状态代码, success：成功; fail：失败, string
        "data": {},  # 接口返回结果描述, json数组, 本接口不需要返回数据，返回null
        "info": "OK",  # 接口返回信息描述, 如果为fail, 则为fail的异常描述信息, string
    }
    return result


async def insert_data(data):
    """
    产品过程参数写入数据库
    :param data:
    :return:
    """
    collection = get_mongo_collection(
        database_name=f"{get_organization()}_mes",
        collection_name=f"report_prod_param",
    )
    await collection.insert_one(data)
